# 2024.06.24——比特Python代码案例
# 程序猿鼓励师

# 在敲代码的过程中，每隔一段时间，让电脑发出声音来鼓励一下自己~~~
# 需要实现的功能
# 1.播放声音——通过playsound第三方库
# 2.监听键盘按键，比如连续按键N次，播放一个音频，并且每次播放的音频都不一样——通过pynput实现

# 实现程序员鼓励师的步骤
# 1.通过pip安装第三方库
# pynput版本安装1.6.8——pip install pynput==1.6.8
# playsound版本安装1.2.2——pip install playsound==1.2.2

# 2.准备需要播放的音频
# 音频准备好后需要拷贝到项目中
# 资源文件的获取——1.自己原创、2.到资源网站寻找

# 3.引入模版
import random
from playsound import playsound
from pynput import keyboard
from threading import Thread

# 音频列表
sound_list = ['sound/0.mp3', 'sound/1.mp3', 'sound/2.mp3', 'sound/3.mp3']

# 通过全局变量来记录按键的松开次数
count = 0


def onRelease(key):
    """
    这个函数，就是在用户释放键盘按键的时候，就会被调用
    这个函数不是咱们自己主动调用，而是把这个函数交给Listener，
    由Lisrener在用户释放按键的时候自动调用，
    像这样的不是咱们主动调用，而是交给别人在合适的时机进行调用的函数，称为“回调函数”
    :param key:
    :return:
    """
    # print(key)
    global count
    count += 1
    if count % 20 == 0:
        # 播放音频
        i = random.randint(0, len(sound_list) - 1)
        print(i)
        print(count)
        # playsound(sound_list[i])
        # 此时直接播放会出现卡顿的现象，因为播放音频与按键操作产生了冲突
        # 为了解决这个冲突，我们则可以通过创建一个新线程来解决
        # 通过threading模块中的Tread类来创建线程
        # target——线程将要执行的目标函数
        # args——目标函数的参数，以元组形式传递
        t = Thread(target=playsound, args=(sound_list[i],))
        t.start()   # 启动线程
        if t.is_alive():
            print("线程正在运行")
        else:
            print("线程已结束")


# 通过变量来获取键盘按键的动作
# 当变量创建好后，键盘按键的动作就能够被捕获到
# 为了根据按键的捕获信息来进行相应的反馈，我们还需要在捕获到按键之后执行一段代码
# on_press——捕获键盘按下操作
# on_release——捕获键盘松开操作
# 其参数值为一个函数
listen = keyboard.Listener(on_release=onRelease)
listen.start()  # 通过start方法来启动该变量
listen.join()  # 通过join方法来等待该变量结束

# 测试程序员鼓励师，鼓励次数设置为20
# 效果还不错，能够做到随机播放
# 现在测试键盘敲击次数为100的情况，敲击时间等待的有点长，音频播放的过程出现了问题
# 继续敲击键盘测试效果，现在将敲击键盘次数修改为了50，再进行测试来看看效果
# 测试还是存在问题，现在设置为40，还是会同时播放两个音频
# 现在测试看看问题出在哪里现在的音频是1次
# 声音会出现混音,现在急需测试，还是会同时播放两个音频
# 现在来测试一下结果如何，此时音频播放的是1个音频，看卡还会不会出现多个音频同时播放，还是会有音频同时播放的问题
# 现在改成单线程来看一下情况，单线程卡顿的现象比较严重，代码还是有问题
# 测试线程测试线程，测试结果为，前面程序启动太多次，运行了多个线程，导致会出现两次音效
